package br.com.lopes.gci.controller;

import static br.com.lopes.gci.util.Constants.FINALIZANDO_METODO;
import static br.com.lopes.gci.util.Constants.INICIANDO_METODO;
import static br.com.lopes.gci.util.Constants.SCOPE_REQUEST;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import br.com.lopes.gci.annotation.ManagedBean;
import br.com.lopes.gci.controller.Validation.FuncionarioValidation;
import br.com.lopes.gci.exception.ManagerException;
import br.com.lopes.gci.manager.FuncionarioManager;
import br.com.lopes.gci.model.Funcionario;
import br.com.lopes.gci.util.Constants;
import br.com.lopes.gci.util.MessageUtil;

@ManagedBean
@Scope(SCOPE_REQUEST)
public class FuncionarioController extends FuncionarioValidation implements InitializingBean{
	
	public static final Logger LOGGER = Logger.getLogger(FuncionarioController.class);
	
	@Autowired 
	private FuncionarioManager funcionarioManager;
	
	private boolean renderGerente = false;
	private boolean renderDiretor = false;
	
	private Funcionario funcionario = new Funcionario();
	private Funcionario diretor = new Funcionario();
	private Funcionario gerente = new Funcionario();
	private List<Funcionario> listaFuncionarios = new ArrayList<Funcionario>();
	
	@Override
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		
	}
	
	public List<Funcionario> getListaFuncionarios() {
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<Funcionario> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public String pesquisarFuncionarios(){
		LOGGER.debug(INICIANDO_METODO + "incluirFuncionario(Funcionario)");
		try{
			listaFuncionarios = funcionarioManager.pesquisarFuncionario(funcionario);
			return Constants.NAVIGATION_SAME_PAGE;
		}catch (ManagerException me) {
			me.printStackTrace();
			MessageUtil.getInstance().setErrorMessage(me.getLocalizedMessage());
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "incluirFuncionario(Funcionario)");
		}
	}
	
	public String excluirFuncionario(){
		LOGGER.debug(INICIANDO_METODO + "excluirFuncionario()");
		try{
			Funcionario func = funcionarioManager.getFuncionarioById(funcionario);
			
			if(funcionarioManager.findFuncionarioByGerente(func).size()>0){
				MessageUtil.getInstance().setDefaultMessageFromBundle("error.gerentePossuiFuncionarioAssociado");
				return Constants.NAVIGATION_SAME_PAGE;
			}
			
			if(funcionarioManager.findFuncionarioByDiretor(func).size()>0){
				MessageUtil.getInstance().setDefaultMessageFromBundle("error.gerentePossuiFuncionarioAssociado");
				return Constants.NAVIGATION_SAME_PAGE;
			}
			
			funcionarioManager.excluirFuncionario(func);
			pesquisarFuncionarios();
			MessageUtil.getInstance().setDefaultMessageFromBundle("func.excluido");
			return Constants.NAVIGATION_SAME_PAGE;
		}catch (ManagerException me) {	
			me.printStackTrace();
			MessageUtil.getInstance().setErrorMessage(me.getLocalizedMessage());
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "excluirFuncionario()");
			
		}
	}
	
	public String incluirFuncionario (){
		LOGGER.debug(INICIANDO_METODO + "incluirFuncionario(Funcionario)");
		try{
			if(funcionario.getPerfil().getCodigo().equals(Constants.PERFIL_CORRETOR)){
				funcionario.setGerente(gerente);
				funcionario.setDiretor(diretor);
			}else{
				if(funcionario.getPerfil().getCodigo().equals(Constants.PERFIL_GERENTE)){
					funcionario.setDiretor(diretor);
					funcionario.setGerente(null);
				}else{
					funcionario.setGerente(null);
					funcionario.setDiretor(null);
				}	
			}
			funcionarioManager.incluirFuncionario(funcionario);
			MessageUtil.getInstance().setDefaultMessageFromBundle("func.incluido");
			return exibirPesquisarFuncionarios();
			
		}catch (ManagerException me) {
			me.printStackTrace();
			MessageUtil.getInstance().setErrorMessage(me.getLocalizedMessage());
			return Constants.NAVIGATION_SAME_PAGE;
		}finally{
			LOGGER.debug(FINALIZANDO_METODO + "incluirFuncionario(Funcionario)");
			
		}
	}
	
		
	public String exibirPesquisarFuncionarios(){
		funcionario = new Funcionario();
		listaFuncionarios = new ArrayList<Funcionario>();
		return Constants.NAVIGATION_PESQUISAR_FUNCIONARIOS;
	}
	
	public String exibirIncluirFuncionario(){
		funcionario = new Funcionario();
		diretor = new Funcionario();
		gerente = new Funcionario();
		return Constants.NAVIGATION_INCLUIR_FUNCIONARIO;
	}
	
	public void mudaPerfil(){
		
		if(funcionario.getPerfil().getCodigo().equals(Constants.PERFIL_CORRETOR)){
			renderGerente = false;
			renderDiretor = false;
		}else{
			if(funcionario.getPerfil().getCodigo().equals(Constants.PERFIL_GERENTE)){
				renderGerente = true;
				renderDiretor = false;
			}else{
				renderGerente = true;
				renderDiretor = true;
			}	
		}
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Funcionario getDiretor() {
		return diretor;
	}

	public void setDiretor(Funcionario diretor) {
		this.diretor = diretor;
	}

	public Funcionario getGerente() {
		return gerente;
	}

	public void setGerente(Funcionario gerente) {
		this.gerente = gerente;
	}

	public boolean isRenderGerente() {
		return renderGerente;
	}

	public void setRenderGerente(boolean renderGerente) {
		this.renderGerente = renderGerente;
	}

	public boolean isRenderDiretor() {
		return renderDiretor;
	}

	public void setRenderDiretor(boolean renderDiretor) {
		this.renderDiretor = renderDiretor;
	}
	
}
